package com.rabbitmq.comsumer.listener;

import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.nio.charset.Charset;
import java.util.concurrent.TimeUnit;

/**
 * @作者: 林江
 * @创建时间: 2023/11/10
 * @功能: 异步注解式监听器, 高级部分
 */
@Component
public class RabbitmqComsumerAnnotateListener {

    /**
     * ackMode: 开启消费者手动应答消息是否接收到。
     */
    @RabbitListener(queues = "test03", ackMode = "MANUAL")
    public void listener1(Message message, Channel channel) throws IOException {
        long deliveryTag = message.getMessageProperties().getDeliveryTag();
        try {
            String data = new String(message.getBody(), Charset.defaultCharset());
            System.out.println(data);
//            int i = 1/0;
            /**
             * 参数1：消息标签
             * 参数2：是否将同一类型的消息全部处理掉
             */
            channel.basicAck(deliveryTag, false); // 自动应打，表示消息成功接收并处理
        } catch (Exception e) {
            System.out.println("重试" + e.getMessage());

            // 重新投递到队列中
            channel.basicNack(deliveryTag, false, true);
        }
    }

    /**
     * 使用注解的形式设置预取值和手动ack确认返回
     *
     * @param message
     * @throws IOException
     */
//    @RabbitListener(queues = "s1", containerFactory = "prefetchRabbitListenerContainerFactory")
    public void listener2(Message message, Channel channel) throws Exception {
        TimeUnit.SECONDS.sleep(1);
        System.out.println("RabbitmqComsumerAnnotateListener，接收到的消息是：" + new String(message.getBody()));

        // 消费者确认消息
        long deliveryTag = message.getMessageProperties().getDeliveryTag();
        channel.basicAck(deliveryTag, false);
    }

    /**
     * 测试死信队列
     * 3.消费者拒接消息，消息是否会投递到死信队列
     *
     * @param message
     * @param channel
     * @throws IOException
     */
    @RabbitListener(queues = "test06")
    public void listener3(Message message, Channel channel) throws IOException {
        long deliveryTag = message.getMessageProperties().getDeliveryTag();
        System.out.println("RabbitmqComsumerAnnotateListener，接收到的消息是：" + new String(message.getBody()));
        channel.basicNack(deliveryTag, false, false);
    }

    /**
     * 监听死信队列
     *
     * @throws IOException
     */
//    @RabbitListener(queues = "test07_dlx")
    public void listener4(String message) throws IOException {
        System.out.println("RabbitmqComsumerAnnotateListener，消费死信队列中的内容。。。。。。。。");
        System.out.println(message);
    }

    /**
     * 测试延时队列 = ttl + dlx
     *
     * @param message
     * @throws IOException
     */
    @RabbitListener(queues = "test07_dlx")
    public void listener5(String message) throws IOException {
        System.out.println("RabbitmqComsumerAnnotateListener，消费延时队列中的内容。。。。。。。。");
        System.out.println(message);
    }

    /**
     * 测试延时队列，使用插件的方式
     *
     * @param message
     * @throws IOException
     */
    @RabbitListener(queues = "test09")
    public void listener6(String message) throws IOException {
        System.out.println("RabbitmqComsumerAnnotateListener，消费延时队列中的内容。。。。。。。。");
        System.out.println(message);
    }

}
